home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / xlisp.lbr / XLISP.HQ / xlisp.h
Text File  |  1985-06-03  |  7KB  |  258 lines

  1.  
  2.                       /* xlisp - a small subset of lisp */
  3.  
  4.  
  5.                         /* system specific definitions */
  6.  
  7. /* DEFEXT       define to enable default extension of '.lsp' on 'load' */
  8. /* FGETNAME     define if system supports 'fgetname' */
  9. /* NNODES       number of nodes to allocate in each request */
  10. /* TDEPTH       trace stack depth */
  11. /* KEYMAPCLASS  define to include the 'Keymap' class */
  12.  
  13.  
  14.                          /* for the VAX-11 C compiler */
  15.  
  16. #ifdef vms
  17. #define DEFEXT
  18. #define FGETNAME
  19. #define KEYMAPCLASS
  20. #define NNODES  2000
  21. #define TDEPTH  1000
  22. #endif
  23.  
  24.                          /* for the DECUS C compiler */
  25.  
  26. #ifdef decus
  27. #define DEFEXT
  28. #define KEYMAPCLASS
  29. #define NNODES  200
  30. #define TDEPTH  100
  31. #endif
  32.  
  33.                             /* for unix compilers */
  34.  
  35. #ifdef unix
  36. #define KEYMAPCLASS
  37. #define NNODES  200
  38. #define TDEPTH  100
  39. #endif
  40.  
  41.                          /* for the AZTEC C compiler */
  42.  
  43. #ifdef AZTEC
  44. #define DEFEXT
  45. #define KEYMAPCLASS
  46. #define NNODES  200
  47. #define TDEPTH  100
  48. #define getc(fp)        getch(fp)
  49. #define kbin()          CPM(6,0xFF)
  50. #define malloc          alloc
  51. #endif
  52.  
  53.                          /* for the CI_86 PC compiler */
  54.  
  55. #ifdef CI_86
  56. #define REALS                               /* Enables real arithmetic code */
  57. /*  #define DEBUG                              Enables debug code           */
  58.                                             /* Module XLDEBUG need not be linked
  59.                                                if DEBUG is undefined        */
  60. #define DEFEXT
  61. #define KEYMAPCLASS
  62. #define NNODES  200
  63. #define TDEPTH  100
  64. #define strchr          index
  65. #endif
  66.  
  67.                        /* default important definitions */
  68.  
  69. #ifndef NNODES
  70. #define NNODES  200
  71. #endif
  72.  
  73. #ifndef TDEPTH
  74. #define TDEPTH  100
  75. #endif
  76.  
  77.                             /* useful definitions */
  78.  
  79. #define TRUE    1
  80. #define FALSE   0
  81.  
  82.                               /* program limits */
  83.  
  84. #define STRMAX  100     /* maximum length of a string constant */
  85.  
  86.                                 /* node types */
  87.  
  88. #define FREE    0
  89. #define SUBR    1
  90. #define LIST    2
  91. #define SYM     3
  92. #define INT     4
  93. #define STR     5
  94. #define OBJ     6
  95. #define FPTR    7
  96. #define KMAP    8
  97. #define REAL    9
  98.  
  99.                                 /* node flags */
  100.  
  101. #define MARK    1
  102. #define LEFT    2
  103.  
  104.                                /* string types */
  105.  
  106. #define DYNAMIC 0
  107. #define STATIC  1
  108.  
  109.                               /* struct defines */
  110.  
  111. struct xsym {
  112.     char *xsy_name;             /* symbol name */
  113.     struct node *xsy_value;     /* the current value */
  114. };
  115.  
  116.                             /* subr node structure */
  117.  
  118. struct xsubr {
  119.     struct node *(*xsu_subr)(); /* pointer to an internal routine */
  120. };
  121.  
  122.                             /* list node structure */
  123.  
  124. struct xlist {
  125.     struct node *xl_value;      /* value at this node */
  126.     struct node *xl_next;       /* next node */
  127. };
  128.  
  129.                           /* integer node structure */
  130.  
  131. struct xint {
  132.     int xi_int;                 /* integer value */
  133. };
  134.  
  135. #ifdef REALS
  136.                             /* real node structure */
  137.  
  138. struct xreal {
  139.     long float xr_real;        /* real value */
  140. };
  141. #endif
  142.  
  143.                            /* string node structure */
  144.  
  145. struct xstr {
  146.     int xst_type;               /* string type */
  147.     char *xst_str;              /* string pointer */
  148. };
  149.  
  150.                            /* object node structure */
  151.  
  152. struct xobj {
  153.     struct node *xo_obclass;    /* class of object */
  154.     struct node *xo_obdata;     /* instance data */
  155. };
  156.  
  157.                         /* file pointer node structure */
  158.  
  159. struct xfptr {
  160.     FILE *xf_fp;                /* the file pointer */
  161. };
  162.  
  163.                              /* keymap structure */
  164.  
  165. struct xkmap {
  166.     struct node *(*xkm_map)[];  /* selection pointer */
  167. };
  168.  
  169.  
  170.              /* shorthand macros for accessing node substructures */
  171.  
  172. /* symbol node */
  173.  
  174. #define n_symname       n_info.n_xsym.xsy_name
  175. #define n_symvalue      n_info.n_xsym.xsy_value
  176.  
  177. /* subr node */
  178.  
  179. #define n_subr          n_info.n_xsubr.xsu_subr
  180.  
  181. /* list node (and message node and binding node) */
  182.  
  183. #define n_listvalue     n_info.n_xlist.xl_value
  184. #define n_listnext      n_info.n_xlist.xl_next
  185. #define n_msg           n_info.n_xlist.xl_value
  186. #define n_msgcode       n_info.n_xlist.xl_next
  187. #define n_bndsym        n_info.n_xlist.xl_value
  188. #define n_bndvalue      n_info.n_xlist.xl_next
  189. #define n_left          n_info.n_xlist.xl_value
  190. #define n_right         n_info.n_xlist.xl_next
  191. #define n_ptr           n_info.n_xlist.xl_value
  192.  
  193. /* integer, real and string  nodes */
  194.  
  195. #define n_int           n_info.n_xint.xi_int
  196. #define n_real          n_info.n_xreal.xr_real
  197. #define n_str           n_info.n_xstr.xst_str
  198. #define n_strtype       n_info.n_xstr.xst_type
  199.  
  200. /* object node */
  201.  
  202. #define n_obclass       n_info.n_xobj.xo_obclass
  203. #define n_obdata        n_info.n_xobj.xo_obdata
  204.  
  205. /* file pointer node */
  206.  
  207. #define n_fname         n_info.n_xfptr.xf_name
  208. #define n_fp            n_info.n_xfptr.xf_fp
  209.  
  210. /* key map node */
  211.  
  212. #define n_kmap          n_info.n_xkmap.xkm_map
  213.  
  214.  
  215.                               /* node structure */
  216.  
  217. struct node {
  218.     char n_type;                /* type of node */
  219.     char n_flags;               /* flag bits */
  220.     union {                     /* value */
  221.         struct xsym n_xsym;     /*     symbol node */
  222.         struct xsubr n_xsubr;   /*     subr node */
  223.         struct xlist n_xlist;   /*     list node */
  224.         struct xint n_xint;     /*     integer node */
  225. #ifdef REALS
  226.          struct xreal n_xreal;  /*     real node */
  227. #endif
  228.         struct xstr n_xstr;     /*     string node */
  229.         struct xobj n_xobj;     /*     object node */
  230.         struct xfptr n_xfptr;   /*     file pointer node */
  231.         struct xkmap n_xkmap;   /*     key map node */
  232.     } n_info;
  233. };
  234.  
  235. #define null_node   = {'\0','\0'}
  236.  
  237.                       /* external procedure declarations */
  238.  
  239. extern struct node *xlread();           /* read an expression */
  240. extern struct node *xleval();           /* evaluate an expression */
  241. extern struct node *xlarg();            /* fetch an argument */
  242. extern struct node *xlevarg();          /* fetch and evaluate an argument */
  243. extern struct node *xlmatch();          /* fetch an typed argument */
  244. extern struct node *xlevmatch();        /* fetch and evaluate a typed arg */
  245. extern struct node *xlsend();           /* send a message to an object */
  246. extern struct node *xlmfind();          /* find the method for a message */
  247. extern struct node *xlxsend();          /* execute a message method */
  248. extern struct node *xlenter();          /* enter a symbol into the oblist */
  249. extern struct node *xlsave();           /* generate a stack frame */
  250. extern struct node *xlobsym();          /* find an object's class or instance
  251.                                            variable */
  252. extern struct node *xlclass();          /* enter a class definition */
  253. extern struct node *xlivar();           /* get an instance variable */
  254. extern struct node *xlcvar();           /* get an instance variable */
  255. extern struct node *newnode();          /* allocate a new node */
  256. extern char *stralloc();                /* allocate string space */
  257. extern char *strsave();                 /* make a safe copy of a string */
  258.